home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 45975 / 45975.xpi / content / weaveIntegration.js < prev   
Text File  |  2009-11-23  |  8KB  |  228 lines

  1.  
  2. /*
  3.  * Copyright (c) 2009 Bui Viet Thanh (thanhbv@gmail.com).
  4.  *
  5.  * This file is part of clicknlearn.
  6.  *
  7.  * clicknlearn is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License as published by
  9.  * the Free Software Foundation, either version 3 of the License, or
  10.  * (at your option) any later version.
  11.  *
  12.  * clicknlearn is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  * GNU General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with clicknlearn.  If not, see <http://www.gnu.org/licenses/>.
  19.  */
  20.  
  21. //@see https://developer.mozilla.org/en/JavaScript_code_modules/Using_JavaScript_code_modules
  22. const EXPORTED_SYMBOLS = ['CNLEngine', 'CNLRec'];
  23.  
  24. //const Cu = Components.utils;
  25.  
  26. Cu.import("resource://gre/modules/XPCOMUtils.jsm");
  27. Cu.import("resource://weave/log4moz.js");
  28. Cu.import("resource://weave/util.js");
  29. Cu.import("resource://weave/engines.js");
  30. Cu.import("resource://weave/stores.js");
  31. Cu.import("resource://weave/trackers.js");
  32. Cu.import("resource://weave/base_records/collection.js");
  33. //
  34. Cu.import("resource://weave/base_records/wbo.js");
  35. Cu.import("resource://weave/base_records/crypto.js");
  36. Cu.import("resource://weave/base_records/keys.js");
  37. //
  38. Cu.import("resource://clicknlearn/cnldao.js");
  39. //
  40. Cu.import("resource://clicknlearn/ext/Observers.js");
  41.  
  42. ///////////////////////////////////////////////////////
  43. function CNLRec() {
  44.     this._CNLRec_init();
  45. }
  46. CNLRec.prototype = {
  47.     __proto__: CryptoWrapper.prototype,
  48.     _logname: "Record.CNL",
  49.  
  50.     _CNLRec_init: function CNLItem_init(uri) {
  51.         this._CryptoWrap_init(uri);
  52.         this.cleartext = {};
  53.     },
  54.     getDecodeData: function(){
  55.         return {"id": decodeURIComponent(this.id), "originalUrl": this.originalUrl
  56.             ,"remind": decodeURIComponent(this.remind), "read": this.read}
  57.     }
  58. };
  59.  
  60. //TODO add modifyTime to vocabulary DB
  61. Utils.deferGetSet(CNLRec, "cleartext", ["word", "originalUrl", "remind", "read"]);
  62.  
  63. ///////////////////////////////////////////////////////
  64. function CNLEngine() {
  65.     this._init();
  66. }
  67. CNLEngine.prototype = {
  68.     __proto__: SyncEngine.prototype,
  69.     name: "cnl",
  70.     _displayName: "CNL",
  71.     description: "Clicknlearn vocabulary database sync with Weave.",
  72.     logName: "CNL",
  73.     _recordObj: CNLRec,
  74.     _storeObj: CNLStore,
  75.     _trackerObj: CNLTracker,
  76.  
  77. //    _sync: Utils.batchSync("CNL", SyncEngine)
  78.  
  79.     _findDupe: function (item) {
  80.         return false;
  81.     }
  82. };
  83.  
  84. ///////////////////////////////////////////////////////
  85. // Maintains the store of all your CNL-type items and their GUIDs.
  86. function CNLStore() {
  87.     this._init();
  88. }
  89. /**
  90.  * Note: because issue "synch fail with vietnamese words" (Issue 4)
  91.  * We encodeURIComponent when set word | remind into CNLRec
  92.  * & decodeURIComponent when get word | remind from CNLRec
  93.  */
  94. CNLStore.prototype = {
  95.     __proto__: Store.prototype,
  96.     _logName: "CNL",
  97.  
  98.     get _wordStm() {
  99.         this._log.debug("Creating SQL statement: _wordStm");
  100.         let stm = CNL_DAO.dbConn.createStatement(
  101.                 'SELECT remind, originalUrl, read FROM vocabulary WHERE word = :word');
  102.         this.__defineGetter__("_wordStm", function() stm);
  103.         return stm;
  104.     },
  105.     _findWordByGUID: function(guid) {
  106.         try {
  107.             this._wordStm.params.word = decodeURIComponent(guid);
  108.             if (!this._wordStm.step())
  109.                 return null;
  110.  
  111.             return {
  112.                 remind: encodeURIComponent(this._wordStm.row.remind),
  113.                 originalUrl: this._wordStm.row.originalUrl,
  114.                 read: this._wordStm.row.read
  115.             };
  116.         }
  117.         finally {
  118.             this._wordStm.reset();
  119.         }
  120.     },
  121.     itemExists: function(id) {
  122.         this._log.debug("CNLStore.itemExists..." + id);
  123.         // Return true if an item with given guid exists in the store.
  124.         // guid we use here is the "word" collumn in vocabulary DB.
  125.         // see: https://wiki.mozilla.org/Labs/Weave/ClientAPI#Writing_a_Store_class
  126.         if (this._findWordByGUID(id))
  127.             return true;
  128.         return false;
  129.     },
  130.     createRecord: function(guid, cryptoMetaURL) {
  131.         this._log.debug("CNLStore.createRecord..." + guid);
  132.         let foo = this._findWordByGUID(guid);
  133.         let record = new CNLRec();
  134.         record.id = guid;
  135.         if (foo) {
  136.             record.remind = foo.remind;
  137.             record.originalUrl = foo.originalUrl;
  138.             record.read = foo.read;
  139.             record.encryption = cryptoMetaURL;
  140.         }
  141.         else
  142.             record.deleted = true;
  143.         this.cache.put(guid, record);
  144.         return record;
  145.     },
  146.     changeItemID: function (oldID, newID) {
  147.         // Find the item with guid = oldId and change its guid to newId.
  148.         //do nothing! see http://adblockplus.org/blog/adding-weave-support-to-an-extension
  149.     },
  150.     getAllIDs: function() {
  151.         // Return a list of the GUIDs of all items.  Invent GUIDs for any items
  152.         // that don't have them already, and remember the mapping for later use.
  153.         let stm = CNL_DAO.dbConn.createStatement('SELECT word FROM vocabulary');
  154.         let items = {};
  155.         try {
  156.             while (stm.step()) {
  157.                 items[encodeURIComponent(stm.row.word)] = true;
  158.             }
  159.         }
  160.         finally {
  161.             stm.reset();
  162.         }
  163.         return items;
  164.     },
  165.     wipe: function() {
  166.         // Delete everything!
  167.         //now: do nothing
  168.     },
  169.     create: function(record) {
  170.         this._log.debug("CNLStore.create...");
  171.         // Create a new item based on the values in record
  172.         CNL_DAO.create(record.getDecodeData());
  173.     },
  174.     update: function(record) {
  175.         this._log.debug("CNLStore.update...");
  176.         // look up the stored record with id = record.id, then set
  177.         // its values to those of new record
  178.         CNL_DAO.update(record.getDecodeData());
  179.     },
  180.     remove: function(record) {
  181.         this._log.debug("CNLStore.remove...");
  182.         // look up the stored record with id = record.id, then delete it.
  183.         CNL_DAO.remove(decodeURIComponent(record.id));
  184.     }
  185. };
  186.  
  187. Utils.deferGetSet(CNLRec, "cleartext", ["word", "originalUrl", "remind", "read"]);
  188.  
  189. ///////////////////////////////////////////////////////
  190. function CNLTracker() {
  191.     this._init();
  192. }
  193. CNLTracker.prototype = {
  194.     __proto__: Tracker.prototype,
  195.     name: "cnl",
  196.     _logName: "CNLTracker",
  197.     file: "cnl",
  198.  
  199.     _init: function HT__init() {
  200.         Tracker.prototype._init.call(this);
  201.         /* Here is where you would register your tracker as an observer, so that
  202.          its onEvent() (or other appropriately named) method can be called
  203.          in response to events. */
  204.         //see https://wiki.mozilla.org/Labs/JS_Modules#Observers
  205.         Observers.add("cnl_wordAddOrModify", this.onWordAddOrModify, this);
  206.     },
  207.  
  208.     onWordAddOrModify: function (word, unuseParam) {//function(subject, data)
  209.         if (this.ignoreAll)
  210.             return;
  211.         this._log.trace("onWordAddOrModify: " + word);
  212.         if (this.addChangedID(encodeURIComponent(word)))
  213.             this._score ++;
  214.     }
  215. };
  216.  
  217. //////////
  218. function CNLService(){
  219.     Utils.delay(this._registerEngine, 7000, this, "_startupTimer");
  220. }
  221. CNLService.prototype = {
  222.     _registerEngine: function(){
  223.         //Weave.Engines.register(Weave["CNLEngine"]);
  224.         Engines.register(CNLEngine);
  225.     }
  226. }
  227.  
  228. var cnlService = new CNLService();